package br.eng.eliseu.gwt.gestaoWeb.model.pessoa;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;

import br.eng.eliseu.gwt.gestaoWeb.model.BaseEntity;
import br.eng.eliseu.gwt.gestaoWeb.model.endereco.Endereco;
import br.eng.eliseu.gwt.gestaoWeb.model.endereco.TipoEnderecoEnum;

@Entity
@SequenceGenerator(name="SQ_PESSOAENDERECO", sequenceName="SQ_PESSOAENDERECO")
@NamedQueries({
	@NamedQuery(name = "pessoaEndereco.porPessoa", query = "select u from PessoaEndereco u where 1=1 "+
			"and u.pessoa = :pessoa "),
			
	@NamedQuery(name = "pessoaEndereco.porPessoaPrincipal", query = "select u from PessoaEndereco u where 1=1 "+
			"and u.pessoa = :pessoa "+
			"and u.principal = :principal "),
			
	@NamedQuery(name = "pessoaEndereco.porPessoaEndereco", query = "select u from PessoaEndereco u where 1=1 "+
			"and u.pessoa = :pessoa "+
			"and u.endereco = :endereco "), 

	@NamedQuery(name="pessoaEndereco.deleteEnderecoNotIn", query = "delete from PessoaEndereco o where 1=1 "+
			"and o.pessoa = :pessoa "+
			"and o not in (:lista)" ),

	@NamedQuery(name="pessoaEndereco.deleteEndereco", query = "delete from PessoaEndereco o where 1=1 "+
					"and o.pessoa = :pessoa ")
	})

public class PessoaEndereco extends BaseEntity{

	private static final long serialVersionUID = 2646870564089416742L;

	public PessoaEndereco() {}
	
	@Id
	@GeneratedValue(generator="SQ_PESSOAENDERECO", strategy=GenerationType.AUTO)
	private Integer id;

	@ManyToOne
	@JoinColumn(name="pessoa_id")
	private Pessoa pessoa;
	
	@Enumerated(EnumType.STRING)
	@Column(length=15)
	private TipoEnderecoEnum tipoEndereco;
	
	private Boolean principal;
	
	@ManyToOne
	@JoinColumn(name="endereco_id")
	private Endereco endereco;
	
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Pessoa getPessoa() {
		return pessoa;
	}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	public TipoEnderecoEnum getTipoEndereco() {
		return tipoEndereco;
	}
	public void setTipoEndereco(TipoEnderecoEnum tipoEndereco) {
		this.tipoEndereco = tipoEndereco;
	}
	public Boolean getPrincipal() {
		return principal;
	}
	public void setPrincipal(Boolean principal) {
		this.principal = principal;
	}
	
	
	public String toString(){
		StringBuffer s = new StringBuffer();
		if ( getPrincipal()){
			s.append("(P)");
		} else {
			s.append("   ");
		}
		s.append(" "+getTipoEndereco().getNome());
		s.append(" "+getEndereco().getLogradouro());
		s.append(", "+getEndereco().getNumero());
		s.append(" "+getEndereco().getBairro());
		s.append("; "+getEndereco().getCidade());
		s.append("-"+getEndereco().getEstado());
		s.append("-"+getEndereco().getPais());

		return s.toString();
	}
	public String getChaveEndereco(){
		StringBuffer s = new StringBuffer();
		s.append(getPrincipal()?"0":"1");
		s.append(getTipoEndereco()!=null?getTipoEndereco().getNome():"");
		s.append(getEndereco().getPais()!=null?getEndereco().getPais():"");
		s.append(getEndereco().getEstado()!=null?getEndereco().getEstado():"");
		s.append(getEndereco().getCidade()!=null?getEndereco().getCidade():"");
		s.append(getEndereco().getLogradouro()!=null?getEndereco().getLogradouro():"");
		s.append(getEndereco().getNumero()!=null?getEndereco().getNumero():"");
		s.append(getEndereco().getBairro()!=null?getEndereco().getBairro():"");

		return s.toString();
	}

	public int compareTo(PessoaEndereco obj) {
		return getChaveEndereco().compareTo(obj.getChaveEndereco());
	}

}
